#ifndef HTTP_H_
#define HTTP_H_
#include "HttpRequest.h"
#include "HttpResponse.h"

#include "Constantes.h"
//// 1xx Mensajes
//#define 100 "Conexión rechazada"
//#define 111 "Conexión rechazada"
//
//// 2xx Operación exitosa
//#define 200 "OK"
//#define 201
//#define 203 "Información no oficial"
//#define 204 "Sin Contenido"
//#define 205 "Contenido para recargar"
//#define 206 "Contenido parcial"
//
//// 3xx Redireción
//
//#define 301 "Mudado permanentemente"
//#define 302 "Encontrado"
//#define 303 "Vea otros"
//#define 304 "No modificado"
//#define 305 "Utilice un proxy"
//#define 307 "Redirección temporal"
//
//// 4xx Error por parte del cliente
//
//#define 400 "Solicitud incorrecta"
//#define 402 "Pago requerido"
//#define 403 "Prohibido"
//#define 404 "No encontrado"
//#define 409 "Conflicto"
//#define 410 "Ya no disponible"
//#define 412 "Falló precondición"
//
////5xx Error del servidor
//
//#define 500 "Error interno"
//#define 501 "No implementado"
//#define 502 "Pasarela incorrecta"
//#define 503 "Servicio nodisponible"
//#define 504 "Tiempo de espera de la pasarela agotado"
//#define 505 "Versión de HTTP no soportada"
#include "Socket.h"

//#define CLRF 0x0D0A
//#define EOF_HTTP CLRFCLRF

class Http {
private:
	Socket* socket;

public:
	Http(Socket* socket);
	virtual ~Http();

	HttpRequest* listenToClient();
	void enviar(HttpResponse* response);



	/*
	 * Pide una respuesta idéntica a la que correspondería a una petición GET,
	 * pero sin el cuerpo de la respuesta. Esto es útil para la recuperación de
	 * meta-información escrita en los encabezados de respuesta, sin tener que transportar
	 * todo el contenido.
	 */
	//void head();
	/*
	 *  Pide una representación del recurso especificado. Por seguridad no debería ser usado por
	 *  aplicaciones que causen efectos ya que transmite información a través de la URI agregando
	 *  parámetros a la URL.
	 *  Ejemplo:
	 * GET /images/logo.png HTTP/1.1 obtiene un recurso llamado logo.png
	 * Ejemplo con parámetros:
	 * /index.php?page=main&lang=es
	 */
	//void get();
	/*
	 * Somete los datos a que sean procesados para el recurso identificado. Los datos se incluirán en el cuerpo de la petición. Esto puede resultar en la creación de un nuevo recurso o de las actualizaciones de los recursos existentes o ambas cosas.
	 */
	//void post();
	/*
	 * Sube, carga o realiza un upload de un recurso especificado (archivo), es el camino más eficiente para subir archivos a un servidor, esto es porque en POST utiliza un mensaje multiparte y el mensaje es decodificado por el servidor. En contraste, el método PUT te permite escribir un archivo en una conexión socket establecida con el servidor.
	 * La desventaja del método PUT es que los servidores de hosting compartido no lo tienen habilitado.
	 * Ejemplo:
	 * PUT /path/filename.html HTTP/1.1
	 */
	//void put();
	/*
	 * Borra el recurso especificado.
	 */
	//void deleteHttp();
	/*
	 * Este método solicita al servidor que envíe de vuelta en un mensaje de respuesta, en la sección del cuerpo de entidad, toda la data que reciba del mensaje de solicitud. Se utiliza con fines de comprobación y diagnostico.
	 */
	//void trace();
	/*
	 * Devuelve los métodos HTTP que el servidor soporta para un URL especifico.Esto puede ser utilizado para comprobar la funcionalidad de un servidor web mediante petición en lugar de un recurso especifico
	 */
	//void options();
	//void connect();
};
#endif
